package gui;

import java.awt.Color;

import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JEditorPane;

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

public class VentanaPrincipal extends JFrame {
	private static final long serialVersionUID = 1L;

	protected JPanel contentPanel, gamePanel, menuPanel, editorPanel;
	protected PanelOpciones optionsPanel;
	protected JEditorPane editorTextPane;
	protected GameGUI gameGUI;
	protected JMenuBar menuBar;
	protected JButton btnStartGame, btnRestartGame, btnTeclado;
	protected VentanaTeclado teclado;

	public VentanaPrincipal() {

		optionsPanel = new PanelOpciones(this);

		contentPanel = new JPanel();
		gamePanel = new JPanel();
		menuPanel = new JPanel();
		editorPanel = new JPanel();
		editorTextPane = new JEditorPane();
		gameGUI = new GameGUI(this);
		menuBar = new BarraMenu(gameGUI);

		teclado = new VentanaTeclado(gameGUI, this);
		teclado.setVisible(false);

		//Botones
		btnStartGame = new JButton("Start Game");
		btnRestartGame = new JButton("Reiniciar Nivel");

		btnTeclado = new JButton("Mostrar Teclado");

		this.setContentPane(contentPanel);
		contentPanel.add(editorPanel);
		editorPanel.add(editorTextPane);
		contentPanel.add(gamePanel);
		contentPanel.add(menuPanel);
		contentPanel.add(optionsPanel);

		menuPanel.add(btnStartGame);
		menuPanel.add(btnRestartGame);

		menuPanel.add(btnTeclado);

		gameGUI.agregarJuegoAlPanel(gamePanel);

		setJMenuBar(menuBar);

		configure();
		addListeners();
	}

	/**
	 * Configura paneles y objetos de la interfaz
	 */
	private void configure() {
		// Paneles
		contentPanel.setLayout(null);
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));

		optionsPanel.setLayout(null);
		optionsPanel.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		optionsPanel.setBounds(320, 21, gameGUI.gameWidth() + 10, gameGUI.gameHeight() + 10);

		gamePanel.setLayout(null);
		gamePanel.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		gamePanel.setBounds(320, 21, gameGUI.gameWidth() + 10, gameGUI.gameHeight() + 10);
		gamePanel.setVisible(false);

		menuPanel.setLayout(null);
		menuPanel.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		menuPanel.setBounds(12, 578, 298, 47);

		editorPanel.setLayout(new GridLayout(0, 1, 0, 0));
		editorPanel.setBorder(new TitledBorder(null, "Editor", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		editorPanel.setBounds(10, 11, 300, 555);

		// Texto
		editorTextPane.setFont(new Font("Consolas", Font.BOLD, 12));
		editorTextPane.setBackground(Color.LIGHT_GRAY);

		// Juego
		gameGUI.agregarLimites(5, 5);

		// Botones
		btnRestartGame.setBounds(12, 10, 120, 26);
		btnRestartGame.setEnabled(false);
		btnTeclado.setBounds(158, 10, 128, 26);

		// JFrame
		this.setBounds(100, 100, 1142, 687);
		this.setResizable(false);
		this.setTitle("Linguo");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);
		this.setVisible(true);
	}

	/**
	 * Agrega listeners
	 */
	private void addListeners() {
		btnStartGame.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				startGame();
			}
		});

		btnRestartGame.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				reiniciarJuego();
			}
		});

		btnTeclado.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				mostrarTeclado();
			}
		});

	}
	
	/**
	 * Termina el juego y vuelve al menu de opciones
	 */
	public void mostrarMenuPrincipal() {
		optionsPanel.setVisible(true);
		gamePanel.setVisible(false);
		btnRestartGame.setEnabled(false);
		((BarraMenu) menuBar).toogleBotonRestart(false);
		((BarraMenu) menuBar).toogleBotonVolver(false);
	}

	/**
	 * Empieza el juego
	 */
	public void startGame() {
		optionsPanel.setVisible(false);
		gamePanel.setVisible(true);
		btnRestartGame.setEnabled(true);
		((BarraMenu) menuBar).toogleBotonRestart(true);
		((BarraMenu) menuBar).toogleBotonVolver(true);

		gameGUI.empezarJuego(optionsPanel.getRobot());
	}

	/** Reinicia el juego */
	private void reiniciarJuego() {
		gameGUI.reiniciarJuego();
	}

	/**
	 * Muestra el teclado por pantalla
	 */
	public void mostrarTeclado() {
		teclado.setVisible(true);
	}

	/**
	 * Devuelve el nivel seleccionado
	 * @return String con el nombre del nivel
	 */
	public String getNivel() {
		return optionsPanel.getNivel();
	}

	public boolean cargoDeArchivo() {
		return optionsPanel.cargoDeArchivo;
	}

	public File getArchivo() {
		return optionsPanel.getArchivo();
	}

}
